﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace terav_totris

{
    /// <summary>
    /// Arvestab mänguseisu ja sellele vastavalt ka
    /// mänguväljaku suurust
    /// </summary>
    class Tase
    {     
        // Väljaku mõõtudega tegelevad muutujad
        public const int VALJAKU_ALGLAIUS = 18;
        public int valjakuLaius = VALJAKU_ALGLAIUS;
        private int valjakuKorgus = 10;
        private int[,] valjak;     

        // Mänguseisuga tegelevad muutujad
        public int manguTase;
        public int manguRidu;
        public int manguSkoor;
        public const int TASEME_RIDU = 10; // mitme täisrea järel muutub tase
        public int taisTulpasid;
        public int abiTase=0;
        public const int VIIMANE_TASE = 9; // tase lõputult ei kasva...

        // Tulemuste kasti keskpunktid, mida kasutatakse tulemuste kuvamiseks
        private static readonly Vector2 TASEME_KASTI_KESKPUNKT = new Vector2(70f, 442f);
        private static readonly Vector2 RIDADE_KASTI_KESKPUNKT = new Vector2(158f, 442f);
        private static readonly Vector2 SKOORI_KASTI_KESKPUNKT = new Vector2(111f, 526f);

        #region saaJaAnna
        public int ValjakuKorgus
        {
            get { return valjakuKorgus; }
            set { valjakuKorgus = value; }
        }
        
        public int ValjakuLaius
        {
            get { return valjakuLaius; }
            set { valjakuLaius = value; }
        }           
        
        public int [,] Valjak
        {
            get { return valjak;}
            set { valjak = value; }
        }
        #endregion
        
        /// <summary>
        /// Konstruktor. Määrab mänguväljaku suuruse ja laseb väljaku
        /// ruudud väärtustada. Seab mänguseisu näitajad nulli.
        /// </summary>
        public Tase()
        { 
            valjak = new int [valjakuLaius, valjakuKorgus];
            algValjak();

            manguTase = 0;
            manguRidu = 0;
            manguSkoor = 0;            
        }

        /// <summary>
        /// See meetod lähtestab mänguväljaku kõikide ruutude väärtuseks -1 - kogu väljaks on tühi
        /// </summary>
        public void algValjak()
        {
            valjakuLaius = VALJAKU_ALGLAIUS;

            for (int tulp = 0; tulp < valjakuLaius; tulp++)
            {
                for (int rida = 0; rida < valjakuKorgus; rida++)
                {
                    valjak[tulp, rida] = -1;
                }
            }
        }
        
        /// <summary>
        /// Meetodit kasutatakse tulpadest asukohaväljaku joonistamiseks
        /// </summary>
        /// <param name="tekstuur">Joonistatava tulba tekstuur</param>
        /// <param name="tulbaAsukohaVektor">Tulba asukoht</param>
        /// <param name="spriteBatch">Spritebatch joonistamiseks</param>
        public void JoonistaValjak(Texture2D tekstuur, Vector2 tulbaAsukohaVektor, SpriteBatch spriteBatch)
        {
            spriteBatch.Begin();
            for (int i = 0; i < valjakuLaius; i++)
            {
                Vector2 veeruKoht;
                veeruKoht.Y = tulbaAsukohaVektor.Y;
                veeruKoht.X = tulbaAsukohaVektor.X - (i * 30) - (manguTase * 30);
                spriteBatch.Draw(tekstuur, veeruKoht, Color.White);
            }

            spriteBatch.End();
        }

        /// <summary>
        /// Joonistab paika pandud kujundi mänguväljakule
        /// </summary>
        /// <param name="spriteBatch">Joonistav spritebatch</param>
        public void JoonistaPaigasKujundid(SpriteBatch spriteBatch)
        {
            for (int tulp = 0; tulp < valjakuLaius; tulp++)
                for (int rida = 0; rida < valjakuKorgus; rida++)
                    if (valjak[tulp, rida] != -1)
                    {
                        Vector2 loppAsukoht;
                        loppAsukoht = Totris.vasakYlaNurk
                                   + LoppAsukohtValjal (tulp, rida);
                        spriteBatch.Begin();
                        spriteBatch.Draw(Totris.klotsiPildid[valjak[tulp, rida]], loppAsukoht, Color.White);
                        spriteBatch.End();
                    }
        }

        /// <summary>
        /// Väljastab paikapandud kujundi asukoha pikslites 
        /// mänguväljaku vasaku ülanurga suhtes
        /// </summary>
        /// <param name="rida">Kujundi asukoha rida</param>
        /// <param name="veerg">Kujundi asukoha veerg</param>
        /// <returns>asukohavektor</returns>
        public static Vector2 LoppAsukohtValjal (int rida, int veerg)
        {
            Vector2 result;
            result.X = rida * Kujund.klotsiSuurus;
            result.Y = veerg * Kujund.klotsiSuurus;

            return result;
        }

        /// <summary>
        /// Arvestab mängutaset ja 
        /// Taseme suurenedes teeb mänguväljaku kitsamaks ühe tulba võrra
        /// </summary>
        /// </summary>
        public void UuendaTase()
        {
            abiTase = (int)(manguRidu / TASEME_RIDU);
            if (manguTase < abiTase && manguTase <= VIIMANE_TASE)
            {
                manguTase = abiTase;
                valjakuLaius--;
            }
        }

        
        /// <summary>
        /// Tegeleb täidetud tulpadega, kustutab tulba ja liigutab teised selle võrra paremale
        /// </summary>
        /// <returns>Täissaanud tulpade arv</returns>
        public int TegeleTaisTulbaga()
        {
            taisTulpasid=0;

            for (int tulp = 0; tulp < valjakuLaius; tulp++)
            {
                bool tulpTais = true;

                for (int rida1 = 0; rida1 < valjakuKorgus; rida1++)
                {
                    if (valjak[tulp, rida1] == -1)
                    {
                        tulpTais = false;
                    }
                }


                if (tulpTais)
                {
                    taisTulpasid++;

                    for (int tulp1 = tulp; tulp1 > 0; tulp1--)
                    {
                        for (int rida2 = 0; rida2 < valjakuKorgus; rida2++)
                        {
                            valjak[tulp1, rida2] = valjak[tulp1 - 1, rida2];
                        }                        
                    }

                    for (int rida3=0; rida3 < valjakuKorgus-1; rida3++)
                    {
                        valjak[0, rida3] = -1;
                    }

                }
            }

            return taisTulpasid;
        }

        /// <summary>
        /// Vastavalt täis saanud tulpade arvule annab mängijale punkte
        /// </summary>
        /// <param name="taisTulpasid">Täis saanud tulpade arv</param>
        public void UuendaSkoor(int taisTulpasid)
        {
            manguRidu += taisTulpasid;
            
            switch (taisTulpasid)
            {
                case 0:
                    break;
                case 1:
                    manguSkoor += 100;
                    break;
                case 2:
                    manguSkoor += 300;
                    break;
                case 3:
                    manguSkoor += 500;
                    break;
                case 4:
                    manguSkoor += 800;
                    break;
            }
        }

        /// <summary>
        /// Joonistame mängu skoori, taseme ja täisridade arvu
        /// </summary>
        /// <param name="manguFont">Kasutatav font</param>
        /// <param name="spriteBatch">Joonistamiseks spritebatch</param>
        public void JoonistaManguTulemus(SpriteFont manguFont, SpriteBatch spriteBatch)
        {
            spriteBatch.Begin();

            Vector2 tasemePikkus = manguFont.MeasureString(manguTase.ToString());
            spriteBatch.DrawString(manguFont, manguTase.ToString(), TASEME_KASTI_KESKPUNKT - 0.5f * tasemePikkus, Color.Black);

            Vector2 ridadePikkus = manguFont.MeasureString(manguRidu.ToString());
            spriteBatch.DrawString(manguFont, manguRidu.ToString(), RIDADE_KASTI_KESKPUNKT - 0.5f * ridadePikkus, Color.Black);

            Vector2 skooriPikkus = manguFont.MeasureString(manguSkoor.ToString());
            spriteBatch.DrawString(manguFont, manguSkoor.ToString(), SKOORI_KASTI_KESKPUNKT - 0.5f * skooriPikkus, Color.Black);

            spriteBatch.End();
        }
    }
}
